<?php

class ActiveRecordLogableBehavior extends CActiveRecordBehavior {

    private $_oldattributes = array();

    //Funcion que se la invoca antes de realizar el guardado o actualizar del modelo
    public function afterSave($event) {

        if (!$this->Owner->isNewRecord) { // si se realiza en el modelo una actualizacion
            // Se obtienen los atributos antiguos y los nuevos antes de que exista persistencia
            $newattributes = $this->Owner->getAttributes();
//            var_dump(($this));
//            var_dump(($this->Owner->$model->getModelName()));
//            die();
            
            $oldattributes = $this->getOldAttributes();

            // compara los atributos entre los nuevos y los antiguos
            foreach ($newattributes as $name => $value) {
                if (!empty($oldattributes)) {
                    $old = $oldattributes[$name];
                } else {
                    $old = '';
                }

                if ($value != $old) { // (ACTUALIZACION)  compara el valor entre el atributo del modelo antiguo con el nuevo
                    //$changes = $name . ' ('.$old.') => ('.$value.'), ';
                    $log = new ActiveRecordLog; // crea un nuevo modelo para guardar la pista de auditoria
                    $log->description = 'Usuario ' . Yii::app()->user->Name
                            . ' actualizó el campo ' . $name . ' para '
                            . get_class($this->Owner)
                            . ' [' . $this->Owner->getPrimaryKey() . '].';
                    $log->action = 'UPDATE';
                    $log->model = get_class($this->Owner);
                    $log->idModel = $this->Owner->getPrimaryKey();
                    $log->field = $name;
                    $log->valor_actual = $old;
                    $log->valor_nuevo = $value;
                    $log->creationdate = new CDbExpression('NOW()');
                    $log->userid = Yii::app()->user->id;
                    $log->ip_user = sprintf("%u", ip2long(Util::obtenerIpUsuario()));
                    $log->dispositivo = Util::obtenerDispositivoUsuario();
                    //todo preguntar por estos datos dependiendo del modelo o la utilidad
                    $log->observacion = $this->Owner->observacion_Auditoria;
                    $log->archivo = $this->Owner->archivo_Auditoria;

                    $log->save();
                }
            }
        } else { //(CREACION)
            $newattributes = $this->Owner->getAttributes();

            $log = new ActiveRecordLog;
            $log->description = 'Usuario ' . Yii::app()->user->Name
                    . ' creó ' . get_class($this->Owner)
                    . ' [' . $this->Owner->getPrimaryKey() . '].';
            $log->action = 'CREATE';
            $log->model = get_class($this->Owner);
            $log->idModel = $this->Owner->getPrimaryKey();
            $log->field = '';
            $log->valor_actual = '';
            $log->valor_nuevo = '';
            $log->creationdate = new CDbExpression('NOW()');
            $log->userid = Yii::app()->user->id;
            $log->ip_user = sprintf("%u", ip2long(Util::obtenerIpUsuario()));
            $log->dispositivo = Util::obtenerDispositivoUsuario();
            //todo preguntar por estos datos dependiendo del modelo o la utilidad
            $log->observacion = isset($this->Owner->observacion_Auditoria)?$this->Owner->observacion_Auditoria:'';
            $log->archivo = isset($this->Owner->archivo_Auditoria)?$this->Owner->archivo_Auditoria:'';
            $log->save();
        }
    }

    //funcion que se invoca antes de borrar en el modelo
    public function afterDelete($event) {
        $log = new ActiveRecordLog;
        $log->description = 'User ' . Yii::app()->user->Name . ' deleted '
                . get_class($this->Owner)
                . '[' . $this->Owner->getPrimaryKey() . '].';
        $log->action = 'DELETE';
        $log->model = get_class($this->Owner);
        $log->idModel = $this->Owner->getPrimaryKey();
        $log->field = '';
        $log->creationdate = new CDbExpression('NOW()');
        $log->userid = Yii::app()->user->id;
        $log->save();
    }

    public function afterFind($event) {
        $this->setOldAttributes($this->Owner->getAttributes());
    }

    public function getOldAttributes() {
        return $this->_oldattributes;
    }

    public function setOldAttributes($value) {
        $this->_oldattributes = $value;
    }

}

?>